home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / Python 1.1 / Demo / tkinter / guido / svkill.py < prev    next >
Encoding:
Python Source  |  1994-10-11  |  4.1 KB  |  146 lines  |  [TEXT/R*ch]

  1. #! /usr/local/bin/python
  2.  
  3. # Tkinter interface to SYSV `kill' command.
  4.  
  5. from Tkinter import *
  6. from string import splitfields
  7. from string import split
  8. import commands
  9. import os
  10.  
  11. user = os.environ['LOGNAME']
  12.  
  13. class BarButton(Menubutton):
  14.     _CNF = {Pack: {'side': 'left'}}
  15.     def __init__(self, master=None, cnf={}):
  16.         Menubutton.__init__(self, master, (self._CNF, cnf))
  17.         self.menu = Menu(self, {'name': 'menu'})
  18.         self['menu'] = self.menu        
  19.  
  20. class Kill(Frame):
  21.     # List of (name, option, pid_column)
  22.     view_list = [
  23.         ('Default', ''),
  24.         ('Every (-e)', '-e'),
  25.         ('Non process group leaders (-d)', '-d'),
  26.         ('Non leaders with tty (-a)', '-a'),
  27.         ('For this user (-u %s)' % user, '-u %s' % user),
  28.         ]
  29.     format_list = [
  30.         ('Default', '', 0),
  31.         ('Long (-l)', '-l', 3),
  32.         ('Full (-f)', '-f', 1),
  33.         ('Full Long (-f -l)', '-l -f', 3),
  34.         ('Session and group ID (-j)', '-j', 0),
  35.         ('Scheduler properties (-c)', '-c', 0),
  36.         ]
  37.     def kill(self, selected):
  38.         c = self.format_list[self.format.get()][2]
  39.         pid = split(selected)[c]
  40.         os.system('kill' + ' -9 ' + pid)
  41.         self.do_update()
  42.     def do_update(self):
  43.         format = self.format_list[self.format.get()][1]
  44.         view = self.view_list[self.view.get()][1]
  45.         s = commands.getoutput('ps %s %s' % (view, format))
  46.         list = splitfields(s, '\n')
  47.         self.header.set(list[0] + '          ')
  48.         del list[0]
  49.         y = self.frame.vscroll.get()[2]
  50.         self.frame.list.delete(0, AtEnd())
  51.         for line in list:
  52.             self.frame.list.insert(0, line)
  53.         self.frame.list.yview(y)
  54.     def do_motion(self, e):
  55.         e.widget.select_from(e.widget.nearest(e.y))
  56.     def do_leave(self, e):
  57.         e.widget.select_clear()
  58.     def do_1(self, e):
  59.         self.kill(e.widget.get(e.widget.nearest(e.y)))
  60.     def __init__(self, master=None, cnf={}):
  61.         Frame.__init__(self, master, cnf)
  62.         self.pack({'expand': 'yes', 'fill': 'both'})
  63.         self.bar = Frame(
  64.             self,
  65.             {'name': 'bar',
  66.              'relief': 'raised',
  67.              'bd': 2,
  68.              Pack: {'side': 'top',
  69.                 'fill': 'x'}})
  70.         self.bar.file = BarButton(self.bar, {'text': 'File'})
  71.         self.bar.file.menu.add_command(
  72.             {'label': 'Quit', 'command': self.quit})
  73.         self.bar.view = BarButton(self.bar, {'text': 'View'})
  74.         self.bar.format = BarButton(self.bar, {'text': 'Format'})
  75.         self.view = IntVar(self)
  76.         self.view.set(0)
  77.         self.format = IntVar(self)
  78.         self.format.set(0)
  79.         for num in range(len(self.view_list)):
  80.             label, option = self.view_list[num]
  81.             self.bar.view.menu.add_radiobutton(
  82.                 {'label': label,
  83.                  'command': self.do_update,
  84.                  'variable': self.view,
  85.                  'value': num})
  86.         for num in range(len(self.format_list)):
  87.             label, option, col = self.format_list[num]
  88.             self.bar.format.menu.add_radiobutton(
  89.                 {'label': label,
  90.                  'command': self.do_update,
  91.                  'variable': self.format,
  92.                  'value': num})
  93.         self.bar.tk_menuBar(self.bar.file,
  94.                     self.bar.view,
  95.                     self.bar.format)
  96.         self.frame = Frame(
  97.             self, 
  98.             {'relief': 'raised', 'bd': 2,
  99.              Pack: {'side': 'top',
  100.                 'expand': 'yes',
  101.                 'fill': 'both'}})
  102.         self.header = StringVar(self)
  103.         self.frame.label = Label(
  104.             self.frame, 
  105.             {'relief': 'flat',
  106.              'anchor': 'nw',
  107.              'borderwidth': 0,
  108.              'font': '*-Courier-Bold-R-Normal-*-120-*',
  109.              'textvariable': self.header,
  110.              Pack: {'side': 'top', 
  111.                  'fill': 'y',
  112.                 'anchor': 'w'}})
  113.         self.frame.vscroll = Scrollbar(
  114.             self.frame,
  115.             {'orient': 'vertical'})
  116.         self.frame.list = Listbox(
  117.             self.frame, 
  118.             {'relief': 'sunken',
  119.              'font': '*-Courier-Medium-R-Normal-*-120-*',
  120.              'geometry': '40x10',
  121.              'selectbackground': '#eed5b7',
  122.              'selectborderwidth': 0,
  123.              'yscroll': self.frame.vscroll.set})
  124.         self.frame.vscroll['command'] = self.frame.list.yview
  125.         self.frame.vscroll.pack({'side': 'right', 'fill': 'y'})
  126.         self.frame.list.pack(
  127.             {'side': 'top',
  128.              'expand': 'yes',
  129.              'fill': 'both'})
  130.         self.update = Button(
  131.             self,
  132.             {'text': 'Update',
  133.              'command': self.do_update,
  134.              Pack: {'expand': 'no',
  135.                 'fill': 'x'}})
  136.         self.frame.list.bind('<Motion>', self.do_motion)
  137.         self.frame.list.bind('<Leave>', self.do_leave)
  138.         self.frame.list.bind('<1>', self.do_1)
  139.         self.do_update()
  140.  
  141. if __name__ == '__main__':
  142.     kill = Kill(None, {'bd': 5})
  143.     kill.winfo_toplevel().title('Tkinter Process Killer (SYSV)')
  144.     kill.winfo_toplevel().minsize(1, 1)
  145.     kill.mainloop()
  146.